<?php
/**
 * Classe para controle de emails
 * @author Ricardo Santos Alvarenga
 * @since 22/08/2011
 *
 */
class Admin_EmailsController extends Zend_Controller_Action
{
    protected $_email;
    protected $_listaemail;
    protected $_lista;
    protected  $_join_filtro;
    protected  $_perfilLogado;
    
    public function init ()
    {
        // Models
        $this->_email = new Application_Model_Email();
        $this->_listaemail = new Application_Model_Listaemail();
        $this->_lista = new Application_Model_Lista();
        $this->_join_filtro = new Application_Model_JoinFiltro();
        $this->_perfilLogado=NULL;
    }
    public function preDispatch ()
    {
        if (! Zend_Auth::getInstance()->getIdentity()) {
            $this->_redirect('/autenticacao');
        }else{
        	$auth = Zend_Auth::getInstance();
        	$this->_perfilLogado = $auth->getIdentity()->idperfil;
        }
    }
    public function addAction ()
    {
        // Formulario inserindo email
        $form = new Application_Form_Email();
        $this->view->form = $form;
        if ($this->_request->isPost()) {
            $dadosForm = $this->_request->getPost();
            if ($form->isValid($dadosForm)) {
                try {
	                    $this->_email->addEmail($dadosForm['nome'], 
	                    $dadosForm['email'], $dadosForm['sexo'], 
	                    $dadosForm['datanascimento'], $dadosForm['cidade'], 
	                    $dadosForm['estado'], $dadosForm['optin']);
	                    // pega o id do email que acabou de ser inserido
	                    $tempId = $this->_email->procuraIdEmail($dadosForm['email']);
	                    // tamanho da matriz de listas vinda do formulario
	                    $tamLista = count($dadosForm['lista']);
	                    // insere os registros pelo laço
	                    for ($i = 0; $i < $tamLista; $i ++) {
	                        $this->_listaemail->addRelacionamento($dadosForm['lista'][$i], $tempId['idemail']);
	                    }
	                    $this->_helper->flashMessenger(array('flashmessage' => 'E-email <strong>'.$dadosForm['email'] .'</strong> inserido com sucesso!'));
	                    $this->_redirect('admin/emails/add');
                } catch (Zend_Db_Exception $e) {
                    $this->_helper->flashMessenger(array('flashmessage' => 'Não foi possível salvar e-mail em nosso sistema, pois o email ja existe em nossa base de dados. Para maiores informações contacte o administrador do sistema!'));                    
                }
            }
        }
    }
    
    public function buscarAction()
    {
    	// Formulario buscando email
        $form = new Application_Form_BuscaEmail();
        $formAvancado = new Application_Form_BuscaAvancadaEmails();
        $listas = $this->_lista->listaAllListas()->toArray();
        $form->getElement('Buscar')->setName('Pesquisar');
        $this->view->form = $form;  
        $this->view->formAvancado = $formAvancado;     
        foreach ($listas as $lista) :
    			$this->view->optionListas .= "<option value=".$lista['idlista']." label='".$lista['nome']."'>".$lista['nome']."</option>";
		endforeach;
        
		//verifica se foi submetido
		if ($this->_request->isPost()) 
		{
			    $dadosForm = $this->_request->getPost();
			    unset($dadosForm['PesquisaAvancada']);
			    if($dadosForm['tipo']=='buscaNormal')
			    {
				    //verifica se os dados do formularios estão corretos
	            	if ($form->isValid($dadosForm)) 
	            	{
						//Pega os dados do model passando como parametro o valor digitado no formulario
						$data = $this->_email->procuraEmail($dadosForm['email']);
	            	}
			    }else
			    {
			    	unset($dadosForm['tipo']);
			    	$lista = array_keys($dadosForm,1);
			    	$data = $this->_email->procuraEmailAvancado($lista);
			    }
		}
		$this->view->BuscaEmailPaginacao = $data;
		
      
    }
    
 	// editar email
    public function editarAction ()
    {
    	// se não existir parametro (id) redireciona para pagina inicial
        if ($this->_hasParam('id') == false) 
        {
            $this->_redirect('/admin/');
            
        } else {
        	$idemail = $this->_request->getParam('id');
		    $remail = $this->_email->procuraId($idemail);		    
		    $form = new Application_Form_Email();
		    $form->removeElement('lista');
		    $form->setDefault('optin', $remail['optin']);
		    $tempNascimento = implode("/",array_reverse(explode("-",$remail['datanascimento'])));
		    $remail['datanascimento']=$tempNascimento;
		    $form->populate($remail);
		    $this->view->form = $form;
			    //Se for via post
		    if($this->_request->isPost()){
		    	$dadosForm = $this->_request->getPost();
		    	 if ($form->isValid($dadosForm)) {		    	
			    	unset($dadosForm['Salvar']); //Remove o submit do array de dados
			    	unset($dadosForm['Cancelar']); //Remove o cancelar do array de dados
			    	$dataAniversario = implode("-",array_reverse(explode("/",$dadosForm['datanascimento'])));
			    		    	
			    	try {
			    		$this->_email->update($idemail,$dadosForm['nome'], 
		                    $dadosForm['email'], $dadosForm['sexo'], 
		                    $dataAniversario, $dadosForm['cidade'], 
		                    $dadosForm['estado'], $dadosForm['optin']);
		                    
		                $this->_helper->flashMessenger(array('flashmessage'=>'E-mail atualizado com sucesso!'));
			    		$this->_redirect('/admin/emails/editar/id/'.$idemail);
			    		
			    }catch (Zend_Db_Exception $e) {
		         	$this->_helper->flashMessenger(array('flashmessage' => 'Não foi possível salvar e-mail em nosso sistema!' .$e));
		    	}
			  }
		   }
        }
    }
    
    // excluindo e-mail
    public function excluirAction ()
    {
    	// se não existir parametro (id) redireciona para pagina lista inicial
        if ($this->_hasParam('id') == false) {
            $this->_redirect('/admin/');
        } else {
            $idEmail = $this->_request->getParam('id');
            
            try{
            	$this->_email->excluirEmail($idEmail);
           		$this->_helper->flashMessenger(array('flashmessage' => 'E-mail excluído com sucesso.</div>'));
            	$this->_redirect('/admin/emails/buscar');
            }catch (Zend_Db_Exception $e) {
		         	$this->_helper->flashMessenger(array('flashmessage' => 'Não foi possível excluir o e-mail.</div>' .$e));
        	}
    	}
    }
    
    // importando base CSV
    public function importAction()
    {
    	if($this->_perfilLogado==1){
	    	// Formulario importando base
	        $form = new Application_Form_ImportarEmails();
	        $this->view->form = $form;
	        // Caminho do upload
	        $pathUpload = APPLICATION_PATH.'\arquivos_csv';  
	        
	    	if($this->_request->isPost() and $form->isValid($_POST)){ 
	    		//pegando dados do formulario
	    		$dadosFormulario = $this->_request->getPost();
	    		// adaptador de transferencia de arquivo  
	    	    $adapter = new Zend_File_Transfer_Adapter_Http();  
	    		$adapter->setDestination($pathUpload);
	    		// nome original do arquivo    		
	    		$nomeAntigo = pathinfo($adapter->getFileName());
	    		// novo nome de arquivo (Ymdhms)
	    		$novoNome = date("Ymdh") . '.' . $nomeAntigo['extension'];
	    		// renomeando o arquivo
	        	$adapter->addFilter('Rename', $novoNome);
	        	// deletar base atual
	        	if($dadosFormulario['devem']== 'add'){ // adicionar sem apagar
	        		$deletar = false;
	        	}else{
	        		$deletar = true;
	        	}
	    		     
	    		if (!$adapter->receive()) {
	    			// se ocorrer algum erro no upload
	        		$messages = $adapter->getMessages();
	        		//$this->view->msg = implode("\n", $messages);
	   		 	}else{   		 	
		   		 	// se o upload foi realizado com sucesso   		 	
		   		 	// configuramos a abertura de arquivo
		   		 	$url = pathinfo($adapter->getFileName());
		   		 	$arquivoCSV = fopen($url['dirname'].'/'.$url['filename'].'.'.$url['extension'], 'r');
		   		 	// cria uma matriz multidimensional para armazenar os dados do arquivo
		   		 	$dadosArquivo = array(array());
	   		 	    // verifica se o arquivo foi aberto sem falhas
		   		 	if($arquivoCSV != false){
		   		 		$linha = 0;
		   		 		while(($dados = fgetcsv($arquivoCSV, 0, $dadosFormulario['separador'])) != false){
		   		 			// quantidade dados da primeira linha [variavel]
			   		 		$quant_campos = count($dados);
			   		 		
			   		 		for($i = 0; $i < $quant_campos; $i++){
			     			 	$dadosArquivo[$linha][$i] = $dados[$i];
			    				}
			    				// incrementa a linha [variavel]
			    			$linha++;
		   		 		}// acabou os dados no arquivo
		   		 	}	   		 	
		   		 	// fecha o arquivo
		   		 	fclose($arquivoCSV);
		   		 	// configurando os dados
		   		 	$this->_forward('configurando','emails','admin',array('dados'=>$dadosArquivo, 'deletar'=>$deletar, 'plinha'=>$dadosFormulario['plinha'], 'lista'=>$dadosFormulario['lista']));	   		 		
		   	 	} 
	    	}
	    }else{
	    	$this->_redirect('admin/');
	    }
    }
	// configurando os dados importados na base
    public function configurandoAction()
    {
    	if($this->_request->isPost()){
    		$data = $this->_request->getParams();
    		//ordem default das colunas
    		$indiceCol = array('nome'=>0,'email'=>1,'sexo'=>2,
    							'datanascimento'=>3,'cidade'=>4,'estado'=>5);
    		//ponteiro de leitura do arquivo default fica na posiçao zero
    		$indiceLinha = 0;
    		$dadosCsv = $data['dados'];
    		$primeiraLinha = $data['dados'][0];    		
    		// se primeira linha contem titulo dos campos pega os indices correspondentes para inserção na base
    		if($data['plinha']=='titulo'){
    			//muda o ponteiro para posiçao 1 de leitura do arquivo
    			$indiceLinha = 1;
    			for($i=0; $i< count($primeiraLinha);$i++){
					switch ($primeiraLinha[$i]) {
    					case 'nome':
        					$indiceCol['nome']=$i;
        					break;
        				case 'email':
        					$indiceCol['email']=$i;
        					break;
        				case 'sexo':
        					$indiceCol['sexo']=$i;
        					break;
        				case "datanascimento":
        					$indiceCol['datanascimento']=$i;
        					break;
        				case "cidade":
        					$indiceCol['cidade']=$i;
        					break;
        				case "estado":
        					$indiceCol['estado']=$i;
        					break;
        				case "optin":
        					$indiceCol['optin']=$i;
        					break;							
					}//fim do switch
    				
    			}//fim do for
 
    			// gravando os dados
	   		 	$this->_forward('gravando','emails','admin',array('indiceCol'=>$indiceCol, 'dadosCsv'=>$dadosCsv, 'indiceLinha'=>$indiceLinha,'deletar' =>$data['deletar'],'lista'=>$data['lista']));
				    		
    		}//fim do if
    		else
    		{
    			// gravando os dados
	   		 	$this->_forward('gravando','emails','admin',array('indiceCol'=>$indiceCol, 'dadosCsv'=>$dadosCsv, 'indiceLinha'=>$indiceLinha,'deletar' =>$data['deletar'],'lista'=>$data['lista']));
    		}
    	}//fim do if
    }
    
    // gravando os dados importados na base
    public function gravandoAction()
    {
    	$emailsGravados=0;
    	//pegando valores do post
    	if($this->_request->isPost()){
    		$dados = $this->_request->getParams(); 
    		$deletar = $dados['deletar']; //deletar base de dados antes de inserir o registro (true ou false)   		
    		//inserindo registros
    	if($deletar == true){ 
    			// se deseja deletar a base antes de inserir
				$this->_listaemail->limparListaEmail();
				$this->_email->limparEmail();
	    }
        for($i=$dados['indiceLinha']; $i< count($dados['dadosCsv']);$i++) //linha
    		{
    			//check se email é valido
    			if($this->_email->checkEmailValido($dados['dadosCsv'][$i][$dados['indiceCol']['email']]))
    			{
	    				//verifica duplicidade de email
	    				$tempIdEmail = $this->_email->procuraIdEmail($dados['dadosCsv'][$i][$dados['indiceCol']['email']]);
	    				//flag se possui registro de email no banco
	    				$flag = count($tempIdEmail); 
	    				 if($flag==0)
	    				 {	    				 		
	    				 			$this->_email->addEmail($dados['dadosCsv'][$i][$dados['indiceCol']['nome']], 
		    						$dados['dadosCsv'][$i][$dados['indiceCol']['email']], 
		    						$dados['dadosCsv'][$i][$dados['indiceCol']['sexo']], 
		    						$dados['dadosCsv'][$i][$dados['indiceCol']['datanascimento']],
		    						$dados['dadosCsv'][$i][$dados['indiceCol']['cidade']], 
		    						$dados['dadosCsv'][$i][$dados['indiceCol']['estado']], 
		    						$dados['dadosCsv'][$i][$dados['indiceCol']['optin']]);
		    						$tempIdEmail = $this->_email->procuraIdEmail($dados['dadosCsv'][$i][$dados['indiceCol']['email']]);
		    						$this->_listaemail->addRelacionamento($dados['lista'], $tempIdEmail['idemail']);
		    						$emailsGravados++;   				 			
	    				 		
	    				 }//fim do if duplicidade
	    				 else
	    				 {	
	    				    //verifica se este email ja se encontra na lista desejada
	    				    $tempIdListaEmail = $this->_listaemail->verificaRelacionamento($dados['lista'], $tempIdEmail['idemail']);
	    				 	if($tempIdListaEmail==false) 
	    				 	{ 
	    				 		// se nao se encontra, então adiciona o relacionamento
	    				 		$this->_listaemail->addRelacionamento($dados['lista'], $tempIdEmail['idemail']);
	    				 	}
	    				 	$emailsRepetidos[]=$dados['dadosCsv'][$i][$dados['indiceCol']['email']];
	    				 }
    			}//fim do if check email válido	
    			else
    			{
    				$emailsInvalidos[]=$dados['dadosCsv'][$i][$dados['indiceCol']['email']];
    			}		
    			
    		}//fim do for
    		 
    		$this->view->repetidos = $emailsRepetidos;
    		$this->view->invalidos = $emailsInvalidos;
    		$this->view->gravados = $emailsGravados;
    		
    		//$this->view->maxUploadFileSize = ini_get('upload_max_filesize');
    		//$this->view->postMaxSize = ini_get('post_max_size');
    	}//fim do if
    }

	// adiciona email a listas selecionada
	public function adicionaAction()
	{
		if ($this->_request->isPost()) {
				
			    $dadosForm = $this->_request->getPost();
			    // remove o botao do post
			    unset($dadosForm['Add_email_lista']);
			    $lista = $dadosForm['lista'];
			    $emails = $dadosForm['email'];
			    $emailsAdicionados = 0;			    
			  	//$this->view->email = $emails;
			  	//$this->view->lista = $lista;
			  	$quantidadeEmails = count($emails);
				// insere os registros pelo laço
                for ($i = 0; $i < $quantidadeEmails; $i ++) {
                		// se não existir este relacionamento
                		if(!$this->_listaemail->verificaRelacionamento($lista, $emails[$i])){
                        	$this->_listaemail->addRelacionamento($lista, $emails[$i]);
                        	$emailsAdicionados++;
                		}
                }
                if($emailsAdicionados!=0){
                	$dif = ($quantidadeEmails)-$emailsAdicionados;
                	$this->_helper->flashMessenger(array('flashmessage' => '<strong>'.$emailsAdicionados .'</strong> email(s) adicionados!<br><strong>'.$dif.'</strong> email(s) ja constam na lista selecionada'));
                }else{
                	$this->_helper->flashMessenger(array('flashmessage' => 'E-mail(s) selecionado(s) ja fazem parte da lista!'));
                }
                $this->_redirect('admin/emails/buscar');
		}
	}
	
	/**
	 * metodo para retornar a quantidade de emails por um determinado filtro
	 */
	public function contaEmailAction()
	{
	if ($this->_hasParam('idlista') != false && $this->_hasParam('idfiltro') !=false )
    	{	
				$idlista = $this->_request->getParam('idlista');
				$idfiltro = $this->_request->getParam('idfiltro');
				$result = $this->_join_filtro->listaAllFiltros($idfiltro);
				
				count($result)!=0 ?	$where.='(v.lista_idlista='.$idlista.' and ': $where.='(v.lista_idlista='.$idlista;				
				for($i=0; $i<count($result); $i++)
				{	
					
					if($result[$i]['expressao']=='like'){$porcento='%';} //porcento no caso like
					if($result[$i]['conector'] != NULL)
					{					
						$where .= 'v.'.$result[$i]['campo']." ".$result[$i]['expressao']." '".$result[$i]['palavraChave'].$porcento."' ".$result[$i]['conector']." ";
						
					
					}else
					{
						$where .= 'v.'.$result[$i]['campo']." ".$result[$i]['expressao']." '".$result[$i]['palavraChave'].$porcento."' ";
					}
					
				}
				
				count($result)!=0? $where.=') and v.optin=1 and v.lista_idlista='.$idlista : $where.=' and v.optin=1)';
			
				$total = $this->_email->contaEmail($where);
				$this->view->total = count($total);
		    	
    	}
	}
}
